package com.ht.WeNas.dao.repo;

import com.ht.WeNas.data.dto.FbData;
import com.ht.WeNas.utils.exceptions.MessageException;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Function;

@Repository
public class FileBucketDataRepo {
    private final Map<Long, List<FbData>> fileMap = new ConcurrentHashMap<>();
    private final Lock loadLock = new ReentrantLock();

    /**
     * 获取容器内所有文件
     * @param id 文件容器id
     * @param onDataNotExists 文件不存在时的回调函数
     * @return 容器内的所有文件
     */
    public List<FbData> load(Long id, Function<Long, List<FbData>> onDataNotExists) {
        if (id == null) {
            return List.of();
        }
        if (fileMap.containsKey(id)) {
            return fileMap.get(id);
        }
        try {
            loadLock.lock();
            if (fileMap.containsKey(id)) {
                return fileMap.get(id);
            }
            // long time = System.currentTimeMillis();
            List<FbData> list = onDataNotExists.apply(id);
            if (list == null || list.isEmpty()) {
                throw new MessageException("容器为空");
            }
            // System.out.println("容器" + id + "加载时间：" + (System.currentTimeMillis() - time));
            fileMap.put(id, list);
            return this.load(id, onDataNotExists);
        } finally {
            loadLock.unlock();
        }
    }
    
    /**
     * 删除文件（后续load会访问本地文件）
     * @param id 容器id
     */
    public void dropById(Long id) {
        fileMap.remove(id);
    }
}
